#include "Usart.h"
#include "led.h"
#include "music.h"

uint8_t usart_status = 0;
void usart_init(void)
{
	// 依旧初始化GPIO
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

	GPIO_InitTypeDef k;
	k.GPIO_Mode = GPIO_Mode_AF;
	k.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
	//	k.GPIO_PuPd = GPIO_PuPd_NOPULL;
	k.GPIO_PuPd = GPIO_PuPd_NOPULL;
	k.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOA, &k);

	// 通过串口1进行通信，进行复用
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);

	// 串口1的初始化
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

	USART_InitTypeDef u;
	u.USART_BaudRate = 115200; // 波特率，预先设定
	u.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	u.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; // 全双工
	u.USART_Parity = USART_Parity_No;
	u.USART_StopBits = USART_StopBits_1;
	u.USART_WordLength = USART_WordLength_8b; // 发送的长度

	USART_Init(USART1, &u);

	// 使能
	USART_Cmd(USART1, ENABLE);

	// 中断机制进行处理
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //接收寄存器非空时，触发中断

	/* 4.配置NVIC（如果配置了中断） */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	NVIC_InitTypeDef n;
	n.NVIC_IRQChannel = USART1_IRQn;
	n.NVIC_IRQChannelPreemptionPriority = 2;
	n.NVIC_IRQChannelSubPriority = 2;
	n.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&n);
}
// 中断处理函数
void USART1_IRQHandler()
{
	// 检测这个中断是否发生
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		usart_status = USART_ReceiveData(USART1) & 0xff;
		// // printf("%x of irq\n", res);
		// if (res == '1')
		// {
		// 	// printf("in to led\n");
		// 	usart_status = 1;
		// 	// led_loop();
		// }
		// else if (res == '2')
		// {
		// 	// printf("in to music\n");
		// 	usart_status = 2;
		// 	// music_fun();

		USART_ClearITPendingBit(USART1, USART_IT_RXNE);
	}
}

// 其实这个是可以接收和发送16位的数据，但为了配合上面的USART_WordLength，所以只取低8位
void Usart_SendByte(USART_TypeDef *USARTx, uint8_t ch)
{
	/* 发送一个字节数据到USART */
	USART_SendData(USARTx, ch & 0xff);
	/* 等待发送数据寄存器为空 */
	while (USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)
		;
}
uint8_t Usart_ReceiveByte(USART_TypeDef *USARTx)
{

	/* 等待接收数据寄存器非空 */
	// 在非空的时候接收数据
	while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET)
		;
	/* 接收一个字节数据 */
	return USART_ReceiveData(USARTx) & 0xff;
}

// 因为这块板子没有显示器，所以不能printf，只能输出重定向，最后输出到串口调试工具
int fputc(int c, FILE *stream)
{
	USART1->SR;
	// 可以发送16位，但截取了其中低8位
	USART_SendData(USART1, c & 0xff);
	// 等待TC这个标志，表示数据已经发送完成
	while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
	{
	};
	return (c);
}